<?php
/*
	Desc: Controlador para los usuarios del sistema
			Los usuarios que puede haber son dos:
				- Coordinador docente
					Es el encargado de administrar los usurios
				- Secretario Administrativo
					No tiene privilegios sobre los usuarios
*/
	class UsersController extends AppController 
	{
	
		var $helpers = array('html', 'form','time','javascript','Pagination'); 
		var $layout='menu';
		var $cacheAction = false;
		
		var $uses = array('User','Dependency');
		
		// Componentes que usa el controlador, por ahora en realidad no
        var $components = array('Pagination');
		
		function encriptarPassword() {
			$Security = new Security();
			$user = $this->data['User']['username'];
			$pass = $this->data['User']['password_inseguro'];
			$tipo = $this->data['User']['tipo_usuario'];
			$passSeguro = $Security->hash($user.$pass.$tipo);
			$this->data['User']['password'] = $passSeguro;
		}
		
		/*
			Desc		: Metodo para agregar o editar los datos de un usuario
			Pos Condicion	: El usuario tiene que ser de tipo Coordinador docente
		*/
		function add($user_name=''){
			if( !$this->isUserSuperAdmin() && !$this->isUserAdminOfDependency() ){
				//PARA QUE NO PERMITA ACCESO A USUARIO NO ADMINISTRADOR
				$this->redirect('/index');
			}
			$this->set('size',20);
			
			$this->set('action',"add");
			$dependencias = $this->Dependency->generateList(null,null,null,'{n}.Dependency.id', '{n}.Dependency.nombre');
			if(empty($dependencias)){
				$dependencias = array('');
			}
			$this->set('dependencias',$dependencias);
			if( empty($this->data['User']) ){
				if ($user_name != ''){
					// Se esta editando al usuario
					$this->set('action',"edit");
					$this->data = $this->User->find("username='".$user_name."'");
				}
			}else{
				//se hizo submit
				if($this->getUserDependency()>0){
					// se esta creando un usuario para una dependencia en particular
					$this->data['User']['id_dependencia']=$this->getUserDependency();
				}
				if( $this->validateUser() ){
					// Se encripta el password 
					$this->encriptarPassword();
					// Se guarda el usuario
					if(	$this->User->save($this->data['User']) )
						$this->redirect('/users/index');
					else
						$this->render();	
				}else
					$this->render();	
			}
		}
		
		/*
			Desc		: Metodo para actualizar los datos de un usuario
			Pos Condicion	: El usuario tiene que ser de tipo Coordinador docente
		*/
		function update(){
			if ( !$this->isUserSuperAdmin() || !$this->isUserAdminOfDependency() ){
				//PARA QUE NO PERMITA ACCESO A USUARIO NO ADMINISTRADOR
				$this->redirect('/index');
			}
			$success = true;
			if( !empty($this->data['User']) ){

				if($this->getUserDependency()>0){
					// se esta creando un usuario para una dependencia en particular
					$this->data['User']['id_dependencia']=$this->getUserDependency();
				}
				if( $this->validateUser(false) )
				{
					$this->encriptarPassword();
					$this->User->set($this->data['User']);
					if( !$this->User->save() ){
						$success = false;
					}
				}else{
					$success = false;
				}
			}
			if( $success ){
				$this->redirect('/users/index');	
			}else{
				$this->set('dependencias',$this->Dependency->generateList(null,null,null,'{n}.Dependency.id', '{n}.Dependency.nombre'));
				$this->set('action','edit');
				$this->render('add');
			}
		}
		
		function index(){
		 	if (isset($this->namedArgs['name']))
            {
			   if (isset($this->namedArgs['accion']))
			   {
					$name   = $this->namedArgs['name'];
					$accion = $this->namedArgs['accion'];
					if ($accion=="del")				// Se tiene que borrar a una persona
							$this->User->del($name);
					else if ($accion=="edit")			// Se tiene que editar a una persona
							$this->redirect("/users/add/$name");     
				}
			} 
		 	$this->pageTitle = 'Usuario';
		 	$this->Pagination->show = 5;
			list($order,$limit,$page) = $this->Pagination->init(null,null,array('sortByClass'=>'User','sortBy'=>'username')); // Added
		 	if( $this->getUserDependency() > 0){
		 		$usuarios = $this->User->findAll("id_dependencia=".$this->getUserDependency(),null,$order,$limit,$page);
		 	}else{
		 		$usuarios = $this->User->findAll(null,null,$order,$limit,$page);
		 	}
			$this->set('usuarios', $usuarios);
		}
		
		
		function login(){
			$this->pageTitle = "Login";
			$this->Session->write('noLogin', '1'); //PARA QUE NO MUESTRE LOGOUT EN EL MENU
			$this->set('loginInvalido', 'false');
			if ( !empty($this->data['User']) ) {
				//HAY DATOS DE LOGIN, VERIFICO SI EXISTE EN LA BASE
				$usuario = $this->data['User']['username'];
				$pass = $this->data['User']['password_inseguro'];

				$conditions = array("User.username" => $usuario);
				$fields = array('User.password', 'User.tipo_usuario', 'User.id_dependencia','Dependency.nombre');
				$result = $this->User->find( $conditions , $fields );
				$tipo = $result['User']['tipo_usuario'];
								
				$Security = new Security();
				$passSeguro = $Security->hash($usuario.$pass.$tipo);
				$passEnBase = $result['User']['password'];
				
				if ( $passEnBase == $passSeguro ) {
					$this->Session->write('noLogin', '0'); //PARA QUE NO MUESTRE LOGIN EN EL MENU
					$this->Session->write('usuariosession', $usuario);
					$this->Session->write('usrEsAdmin', $tipo);
					$this->Session->write('usrIdDependencia', $result['User']['id_dependencia']);
					$this->Session->write('usrNombreDependencia', $result['Dependency']['nombre']);
					if (($this->Session->read('redirectURL') != '')) {
						//HABIA RUTA A DONDE IR, REDIRECCIONO
						$this->redirect($this->Session->read('redirectURL'));
					} else {
						//SI NO HAY RUTA A DONDE IR VOY AL INDEX
						$this->redirect('/index');
					}
				} else {
					//MAL EL USUARIO O PASSWORD
					$this->set('loginInvalido', 'true');
					$this->data['User']['password'] = '';
				}					
			} else {
				//NO HAY DATOS, MUESTRO EL LOGIN
				if (isset($this->params['redirectURL'])){
					$this->Session->write('redirectURL', $this->params['redirectURL']);
					$this->set('redirectURL', $this->params['redirectURL']);
				} else {
					$this->Session->write('redirectURL', '');
				}
			}
		}			
		
		function logout(){
			$this->Session->write('noLogin', '1');
			$this->Session->delete('usuariosession');
			$this->Session->delete('usrEsAdmin');
			$this->Session->delete('usrIdDependencia');
			$this->Session->delete('usrNombreDependencia');
			$this->redirect('/');
		}
	
		function validateUser($checkExists = true){
			$valid = true;
			if( empty($this->data['User']['username']) ){
				$this->User->invalidate('username');
				$valid = false;
			}
			if( $checkExists ){
				$usuario = $this->User->find("username='".$this->data['User']['username']."'");
				if ($usuario){
					//Error porque el nombre de usuario ya existe
					$this->User->invalidate('username_unico');
					$valid = false;   
				}
			}
			if( empty($this->data['User']['password_inseguro']) ){
				$this->User->invalidate('password');
				$valid = false;   
			}
			$tipo = $this->data['User']['tipo_usuario'];
			if($tipo!=0 && $tipo!=1){
				$this->User->invalidate('tipo_usuario');
				$valid = false;   
			}
			$dependencia = $this->data['User']['id_dependencia'];
			if(!$this->Dependency->find("id='".$this->data['User']['id_dependencia']."'")){
				$this->User->invalidate('id_dependencia');
				$valid = false;   
			}
			if(!$valid)
				$this->set('error','No se puedo guardar. Vea los errores por favor.');
			return $valid;
		}
        
        
	}

?>
